home *** CD-ROM | disk | FTP | other *** search
/ Commodore Free 30 / Commodore_Free_Issue_30_2009_Commodore_Computer_Club.d64 / c part 1.1 < prev    next >
Text File  |  2023-02-26  |  17KB  |  636 lines

  1. u
  2.  
  3.  
  4. Alternative Programming Languages: C
  5. Part 1 By Paul Davis
  6.  
  7.  
  8. In the first article of this series we
  9. explored some of the capabilities of
  10. the Forth language. Forth has many
  11. unusual characteristics that make it
  12. well suited to programming on the
  13. Commodore, but it's a language that
  14. polarises opinion. Some people love
  15. it, some hate it, & some just can't
  16. seem to wrap their head around it. So
  17. this time we're going to look at a
  18. more mainstream language, C.
  19.  
  20. C is a compiled language. It's not
  21. like BASIC or Forth where there's an
  22. interpreter you can type commands into
  23. & experiment with. Program code is
  24. entered into text files which are then
  25. run through a compiler to translate
  26. the source code into an executable
  27. program. This makes programming in C
  28. a bit more involved than you may be
  29. used to. Nevertheless, C is a very
  30. powerful & flexible language & is
  31. well worth adding to your programming
  32. repertoire.
  33.  
  34. Although there are several
  35. implementations of C that run on the
  36. Commodore, the lack of memory & poor
  37. disk drive performance makes writing
  38. programs a laborious process. With
  39. that in mind, it provides a good
  40. opportunity to introduce the concept
  41. of cross-development. That is, using a
  42. modern computer to edit & compile
  43. our programs into a form that can be
  44. run either in an emulator or on a real
  45. Commodore machine.
  46.  
  47. As was the case with the Forth
  48. article, this is not a complete
  49. tutorial. It's merely an intro to
  50. some of the features & programming
  51. style of the language to give you an
  52. idea of how it can be used. I'm
  53. going to follow a similar format as
  54. before & present some example programs
  55. with a brief commentary on how they
  56. work.
  57.  
  58. Getting started
  59. We're going to be using a freeware C
  60. compiler called cc65 which is
  61. available in executable form for
  62. Windows, & as source code that can be
  63. compiled for OS X & Linux. The cc65
  64. website can be found at:
  65.  
  66.  http://www.cc65.org/
  67.  
  68. We will also be using the VICE
  69. emulator to test our programs. If you
  70. don't already have this, it can be
  71. downloaded from:
  72.  
  73. http://www.viceteam.org/
  74.  
  75. The first step is to download &
  76. install cc65. Point your browser or
  77. favourite FTP client at the download
  78. area:
  79.  
  80.  ftp://ftp.musoftware.de/pub/uz/cc65/
  81.  
  82. then follow the relevant instructions
  83. for your OS below.
  84.  
  85. Windows XP & Vista
  86. Download the files called
  87. cc65-win32-2.12.0-1.zip &
  88. cc65-c64-2.12.0-1.zip. Next, create a
  89. directory where you want to install
  90. the compiler. This can be anywhere you
  91. like, although I would recommend
  92. avoiding the 'Program Files' directory
  93. (especially on Vista) or directories
  94. with spaces in their name. This
  95. article will assume the directory is
  96. C:\cc65. To install the program,
  97. extract the zip files you downloaded
  98. into the cc65 directory you have just
  99. created.
  100.  
  101. Before we can use the compiler we need
  102. to set up our programming environment
  103. at the command prompt. Open a command
  104. prompt window (hold down the Windows 
  105. key, press R then type 'cmd' & press
  106. Enter) & type the following
  107. commands:
  108.  
  109.   path %path%;c:\cc65\bin
  110.   set CC65_INC=c:\cc65\include
  111.   set CC65_LIB=c:\cc65\lib
  112.  
  113. These instructions tell the command
  114. shell where to find the cc65 programs
  115. and tell cc65 where to find various
  116. files that are needed to compile a
  117. program.
  118.  
  119. You will need to enter these commands
  120. each time you open a new command
  121. prompt window. If you want the
  122. settings to be permanent, here's how
  123. to do it. Press Windows + Break (or
  124. right-click on 'My Computer' & choose
  125. 'Properties') to bring up the System
  126. Properties dialog. On Vista select
  127. 'Advanced system settings' from the
  128. task panel on the left & confirm the
  129. UAC dialog. In the System Properties
  130. dialog click on the 'Advanced' tab,
  131. then on the 'Environment Variables'
  132. button. In the bottom panel for system
  133. variables click on 'New' then enter
  134.  
  135.  'CC65_INC' for the name &
  136.  
  137.  'c:\cc65\include' for the value
  138.  
  139.  & click 'OK'. Do the same for the
  140.  
  141.  'CC65_LIB'
  142.  
  143.  variable with the value 'c:\cc65\lib'
  144.  
  145. Next, scroll down the list to find the
  146. entry for 'Path' & double click it.
  147. Click on the value field & move the
  148. cursor to the end of the value then
  149. add ';c:\cc65\bin' to the end & click
  150. 'OK'. Click on the'OK' button of the
  151. Environment Variable & System
  152. Properties dialogs to complete the
  153. settings.
  154.  
  155. Finally, we need to create a directory
  156. within the cc65 directory to store the
  157. files we will create during this
  158. tutorial.
  159.  
  160.   cd c:\cc65
  161.   mkdir tut
  162.   cd tut
  163.  
  164. OS X & Linux
  165. To keep these instructions as short as
  166. possible I'm going to describe the
  167. procedure for OS X & assume Linux
  168. users will know how to deal with any
  169. differences.
  170.  
  171. First, to compile cc65 we need to
  172. install the Xcode developer tools.
  173. Insert the OS X installation DVD that
  174. was shipped with your Mac & follow the
  175. links to install Xcode.
  176.  
  177. Next, download the file called
  178. cc65-sources-2.12.0.tar.bz2 from the
  179. cc65 web site. You will not need to
  180. download any of the other files.
  181. Assuming the file has been saved to
  182. your 'Downloads' directory, open a new
  183. Finder window & navigate to that
  184. directory. Double-click on the
  185. cc65-sources file & the Archive
  186. Utility will extract it, creating a
  187. directory called 'cc65-2.12.0' in the
  188. Downloads directory.
  189.  
  190. Now we need to work at a command line,
  191. so navigate to Applications then
  192. Utilities & double-click the Terminal
  193. program.
  194.  
  195. Enter this command to change the
  196. current directory to the cc65
  197. directory in Downloads:
  198.  
  199.   cd /Downloads/cc65-2.12.0
  200.  
  201. Now type this command to build the
  202. cc65 program suite:
  203.  
  204.   make -f make/gcc.mak
  205.  
  206. This will take a minute or two to run.
  207. When the command prompt returns enter
  208. these lines:
  209.  
  210.   sudo mkdir /usr/local
  211.   sudo make -f make/gcc.mak install
  212.  
  213. You will probably need to enter the
  214. administrator password to run those
  215. commands. They will install cc65 into
  216. /usr/local/lib/cc65 & the
  217. executables into /usr/local/bin.
  218.  
  219. At the end of the installation, there
  220. will be a message listing two
  221. variables that need to be set up. We
  222. will do this in a minute, but first we
  223. need to create a work directory to
  224. store the files that will be created
  225. during this tutorial. Enter these
  226. lines:
  227.  
  228.   cd /Documents
  229.   mkdir cc65
  230.   cd cc65
  231.  
  232. To make setting up the environment
  233. variables a bit easier we will create
  234. a script to do it for us. Enter this
  235. command:
  236.  
  237.   xed -xc init.sh
  238.  
  239. The Xcode editor will start up &
  240. show a blank document. Enter the
  241. following lines 
  242. into the file:
  243.  
  244.   export CC65_INC=/usr/local/lib/
  245.    cc65/include
  246.   export CC65_LIB=/usr/local/lib/
  247.    cc65/lib
  248.   alias edit='xed -xc'
  249.  
  250. Press Cmd+W & confirm the dialog to
  251. save the file. Finally, enter this
  252. command in the terminal window to run
  253. our script:
  254.  
  255.   . init.sh
  256.  
  257. That's a dot & a space before the
  258. init.sh. This command will need to be
  259. run in any new terminal window when
  260. you want to use cc65.
  261.  
  262. Creating your first program
  263. Because C is a compiled language, the
  264. program code is entered into plain
  265. text files. These files should have a
  266. '.c' extension. The cc65 compiler is
  267. then used to translate the source code
  268. file into an executable program.
  269.  
  270. To keep things as simple as possible
  271. we will use the standard tools
  272. provided by the operating system. On
  273. Windows we will use Notepad for
  274. entering the source code. On OS X we
  275. will be using the Xcode editor which
  276. you have already seen. If you are
  277. using Linux replace 'notepad' or
  278. 'edit' in the instructions below with
  279. your favourite text file editor.
  280. Windows users enter this command:
  281.  
  282.   notepad first.c
  283.  
  284. Notepad will ask if you want to create
  285. a new file, answer yes. OS X users
  286. enter this command:
  287.  
  288.   edit first.c
  289.  
  290. Now type in (or copy & paste) the
  291. program below. To get the # on a Mac
  292. with a UK keyboard press alt/option &
  293. 3.
  294.  
  295.   // My first C program
  296.  
  297.   #include <stdio.h>
  298.  
  299.   void main(void)
  300.  
  301.  +
  302.       puts("It works!");
  303.  !
  304.  
  305. Press Ctrl+S on Windows or Cmd+S on OS
  306. X to save the file. Now flip back to
  307. the command prompt/terminal window.
  308. Windows users enter the command:
  309.  
  310.   dir
  311.  
  312. OS X or Linux users enter the command:
  313.  
  314.   ls -l
  315.  
  316. The directory should show our
  317. 'first.c' file. Now we need to compile
  318. this into a C64 program. To do this,
  319. enter the command:
  320.  
  321.   cl65 first.c
  322.  
  323. If all goes well, the command prompt
  324. should return with no other output
  325. (cc65 follows the Unix philosophy of
  326. 'no news is good news'). If you get an
  327. error message, swap back to the editor
  328. window, make any necessary corrections
  329. save the file, then enter the cl65
  330. command again at the command prompt.
  331.  
  332. Once your program has compiled without
  333. errors, enter the 'dir' (or 'ls')
  334. command again and you should see a
  335. couple of new files, 'first.o' and
  336. 'first'. The 'first.o' file is an
  337. intermediary file created during the
  338. compilation. The file called 'first'
  339. is our C64 program.
  340.  
  341. Next, load up x64, the VICE C64
  342. emulator. Select the option called
  343. 'Autostart' or 'Smart attach' in the
  344. 'File' menu. On Windows navigate to
  345. the c:\cc65\tut directory & select
  346. 'All files (*.*)' as the file type
  347. filter. OS X users navigate to the
  348. Documents/cc65 directory. Now double
  349. click on the file called 'first' &
  350. our program should load & run,
  351. displaying 'It works!' on the screen.
  352.  
  353. That is, in a nutshell, the process
  354. for creating programs in C. This
  355. 'edit, compile, run' sequence of
  356. actions will soon become 2nd nature.
  357.  
  358. Okay, let's take a look at the program
  359. code in more detail. The first thing
  360. to notice is that the code is written
  361. predominantly in lower case. C is case
  362. sensitive & all of its built-in
  363. keywords must be entered in lower
  364. case. The first line in the program is
  365. a comment line. The double slash
  366. characters mark the start of a comment
  367. & all text after the // up to the end
  368. of the line is ignored. C also
  369. supports comments that span multiple
  370. lines. All text between /* and */
  371. markers will be ignored.
  372.  
  373. Skip past the #include line for now,
  374. we will come back to this in a moment.
  375.  
  376. C programs are broken down into
  377. separate named blocks of code called
  378. 'functions'. Each function can take
  379. any number of parameters & can
  380. optionally return a single value. The
  381. next line in the program creates a
  382. function called 'main'. The word
  383. 'void' before the function name
  384. declares the type of the return value,
  385. in this case, void because we are not
  386. going to return a value from the
  387. function. The parameters of a function
  388. are listed after its name inside
  389. brackets. Again, 'void' here means the
  390. function takes no parameters.
  391.  
  392. Typically, many programs follow the
  393. convention of using lower case for
  394. function names, often with multiple
  395. words separated by underscores. For
  396. example, 'move', 'fire' or
  397. 'show_high_scores'. Sometimes you
  398. may see programs or libraries that use
  399. mixed case function names such as
  400. 'NewList' & 'AddListitem'. These are
  401. not enforced by the compiler, they are
  402. just conventions used to make names
  403. consistent & readable.
  404.  
  405. The function called 'main' serves a
  406. special purpose in C. It is auto-
  407. matically called when the program is
  408. run & therefore marks the starting
  409. point of the program. When all the
  410. instructions in the main function have
  411. completed, the program will exit &
  412. return back to BASIC. Every C program
  413. must have a 'main' function.
  414.  
  415. The body of a function is contained
  416. within curly braces. This is the way C
  417. groups together lines of code into
  418. discrete blocks. Our 'main' function
  419. only contains one instruction that
  420. calls another function named 'puts'.
  421. The brackets contain the arguments
  422. passed to that function, in this
  423. example the string "It works!"
  424. delimited by double quotes. The 'puts'
  425. function is one of many standard
  426. functions defined by the C language &
  427. is used to print out a string. Notice
  428. that the instruction is followed by a
  429. semi-colon. This must be used to mark
  430. the end of every separate instruction
  431. in C.
  432.  
  433. Before a function can be called, C
  434. needs to have been previously told
  435. about its name, what parameters it
  436. takes & what type of value it returns.
  437. The C compiler uses this info to check
  438. that the arguments you pass to the
  439. function match up with the parameters
  440. it expects. C is quite strict in this
  441. regard. For example, it would not
  442. allow you to pass a number to the
  443. 'puts' function which expects a string
  444. So, how does the compiler already know
  445. about 'puts' in our example program?
  446.  
  447. The answer lies with the #include line
  448. at the start of the program. This
  449. instruction reads in another file
  450. containing declarations of functions
  451. that are in the standard library, one
  452. of which is 'puts'. These files are
  453. called 'header' files & have the
  454. extension '.h'. The one used here is
  455. 'stdio.h', short for 'standard input
  456. and output'. It contains functions
  457. used to read & write data to files &
  458. other devices including the screen.
  459.  
  460. The core C language itself is very
  461. simple, consisting only of a few
  462. keywords for declaring functions &
  463. variables, testing conditions, looping
  464. & arithmetic operations. The rest of
  465. the features are provided by libraries
  466. of functions. The standard C language
  467. provides a good number of library
  468. functions for many purposes including
  469. string, file & memory handling. The
  470. cc65 compiler provides some additional
  471. libraries & you can also create your
  472. own libraries of often-used functions.
  473.  
  474. Variables
  475. Now let's try using variables in C.
  476. Close the 'first.c' file & create a
  477. new file called 'var.c' at the command
  478. prompt:
  479.  
  480.   notepad var.c
  481.  
  482. Enter the following program into this
  483. file:
  484.  
  485.  #include <stdio.h>
  486.  
  487.  void main(void)
  488.  
  489.  +
  490.   int n = 1000;
  491.   char c = 'X';
  492.   char s[] = "Commodore";
  493.   int a[5] = 1, 10, 100, 1000, 10000;!
  494.   int i;
  495.  
  496.   printf("n = %d\n", n);
  497.   printf("c = %c\n", c);
  498.   printf("s = %s\n", s);
  499.   printf("a =\n");
  500.  
  501.   for (i = 0; i < 5; ++i)
  502.  +
  503.       printf("%5d\n", a[i]);
  504.   !
  505.  !
  506.  
  507. Save the file & compile it at the
  508. command prompt using the cl65 command
  509. as 
  510. before:
  511.  
  512.   cl65 var.c
  513.  
  514. When the program has compiled
  515. correctly, switch back to VICE. You
  516. could run the program using the same
  517. auto-load method as before but,
  518. because VICE has now set up device 8
  519. to point to our tutorial directory
  520. during the last auto-load, you can
  521. also enter the familiar load command
  522. directly into the C64 emulation:
  523.  
  524.   LOAD "VAR",8
  525.   RUN
  526.  
  527. The program should display the values
  528. of the variables. 'n' is a number
  529. variable, 'c' is a character, 's' is a
  530. string & 'a' is an array of numbers.
  531. These short variable names have been
  532. chosen so the code fits in the
  533. narrow columns of the magazine.
  534. Normally, variables would have longer,
  535. more descriptive names!
  536.  
  537. Variables declared inside a function
  538. must be positioned at the start of the
  539. code block, that is, after the opening
  540. curly brace before any other inst-
  541. ructions. These variables will be
  542. 'local' to the function. In other
  543. words, they are only accessible by
  544. that function & only exist temporarily
  545. while the function is running. You may
  546. also create global variables in C by
  547. declaring them outside of any
  548. function. We will see an example of
  549. global variables later.
  550.  
  551. Variable declarations follow this
  552. general format:
  553.  
  554.   type name = value;
  555.  
  556. All variables in C must be declared to
  557. be a specific type. The type dictates
  558. what kind of data can be stored, the
  559. limit on its values & how much memory
  560. the variable takes up. The most
  561. commonly used types in cc65 are:
  562.  
  563.   char - characters or whole numbers
  564.    from -128 to 127
  565.   int - whole numbers from -32768 to
  566.    32767
  567.   long - whole numbers up to +/-
  568.    2,147,483,647
  569.  
  570. These are 'signed' types because they
  571. allow both positive & negative
  572. numbers. C also supports 'unsigned'
  573. types that allow larger positive-only
  574. values:
  575.  
  576.   unsigned char - numbers from 0 to
  577.    255
  578.   unsigned int - numbers from 0 to
  579.    65535
  580.   unsigned long - numbers up to
  581.    4,294,967,295
  582.  
  583. The variable name can be any comb-
  584. ination of letters, numbers & under-
  585. scores (although it can't start with a
  586. number). Conventionally, variables
  587. have lower case names, often with
  588. words separated by underscores. For
  589. example, 'level', 'score',
  590. 'high_score' etc.
  591.  
  592. A variable doesn't have to be assigned
  593. an initial value. Any variable without
  594. an explicit value will contain random
  595. garbage. To avoid errors in your
  596. programs it's usually a good idea to
  597. give variables an explicit initial
  598. value.
  599.  
  600. Arrays
  601. C has no built-in type for strings,
  602. although it does allow a literal
  603. string to be created by putting it in
  604. double quotes. In C, a string is
  605. simply considered to be an array of
  606. characters.
  607.  
  608. Arrays are declared by putting the
  609. size of the array in square brackets
  610. after the variable name. In the
  611. example program, the variable 's' is
  612. declared with empty brackets so the
  613. array will be as long as it needs to
  614. be to fit the string.
  615.  
  616. The variable 'a' is declared as length
  617. 5 & has 5 values assigned to it.
  618. Notice the use of curly braces again
  619. for grouping these values together.
  620.  
  621. To access an element in an array, the
  622. index number of that element is put in
  623. square brackets after the variable
  624. name. Index numbers always start at
  625. zero & go up to the array length -1.
  626. In the example program, we could
  627. access the first element of the
  628. array with a[0] & the last element
  629. with a[4]. Often, we would use some
  630. kind of loop to iterate through all
  631. the elements in an array & use a
  632. variable as the index.
  633.  
  634.         CONTINUED IN PART 1.2
  635.  
  636.